package com.iwhalecloud.bss.kite.cucc.service.attr.linkhandler;

import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.service.attr.handler.MainDeviceAccessAttrHandler;
import com.iwhalecloud.bss.kite.listener.handler.attr.annotation.AttrHandler;
import com.iwhalecloud.bss.kite.listener.handler.attr.impl.AbstractAttrLinkageHandler;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.service.attr.AttrData;

import org.springframework.stereotype.Service;

import java.util.Objects;
import java.util.Optional;

/**
 * 主备接入联动设值
 * Created by  huanghaosheng on 2020/11/25 14:53
 */
@Service
@AttrHandler(MainDeviceAccessAttrHandler.class)
public class MainDeviceAccessAttrLinkHandler extends AbstractAttrLinkageHandler<AttrData> {

    @Override
    public void handle(KiteAttr attr, KiteInst inst, AttrData data) {

    }

    @Override
    public void handleStyle(KiteAttr attr, KiteInst inst, AttrData data) {
        //主备接入联动
        if (KiteStringUtils.isEqual("200004006", attr.getFieldName())) {
            Optional.ofNullable(inst.getAttr("200004009")).ifPresent(kiteAttr -> {
                Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                    if (KiteStringUtils.isEqual("1_0000106", kiteAttr.getValue())) {
                        if (KiteStringUtils.isEqual("1_0000106", attr.getValue())) {
                            funcAttr.setIsNull(KeyConsts.IFTRUE_F);
                        }
                        else {
                            funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                        }
                    }
                });
            });
            //主备接入联动备用客户公网IP是否必填
            if (KiteStringUtils.isEqual("1_0000106", attr.getValue())) {
                Optional.ofNullable(inst.getAttr("200004008")).ifPresent(funcAttr -> {
                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                    funcAttr.setIsNull(KeyConsts.IFTRUE_F);
                });
                Optional.ofNullable(inst.getAttr("200004013")).ifPresent(kiteAttr -> {
                    Optional.ofNullable(inst.getAttr("200004016")).ifPresent(funcAttr -> {
                        funcAttr.setIsNull("T");
                        if (KiteStringUtils.isEqual("1_0000106", kiteAttr.getValue())) {
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                        }
                        else {
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        }
                    });
                });

                Optional.ofNullable(inst.getAttr("200004009")).ifPresent(kiteAttr -> {
                    Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                        if (KiteStringUtils.isEqual("1_0000106", kiteAttr.getValue())) {
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                            funcAttr.setIsNull("F");
                        }
                        else {
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                            funcAttr.setIsNull("T");
                        }
                    });
                });

            }
            else {
                Optional.ofNullable(inst.getAttr("200004008")).ifPresent(funcAttr -> {
                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                    funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                });
                Optional.ofNullable(inst.getAttr("200004016")).ifPresent(funcAttr -> {
                    funcAttr.setIsNull("T");
                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                });

                Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                    funcAttr.setIsNull("T");
                });
            }
        }
        //指定终端地址池联动
        if (KiteStringUtils.isEqual("200004009", attr.getFieldName())) {
            if (KiteStringUtils.isEqual("1_0000106", attr.getValue())) {
                Optional.ofNullable(inst.getAttr("200004006")).ifPresent(kiteAttr -> {
                    Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                        if (KiteStringUtils.isEqual("1_0000106", kiteAttr.getValue())) {
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                            funcAttr.setIsNull(KeyConsts.IFTRUE_F);
                        }
                        else {
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                            funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                        }
                    });
                });
            }
            else {
                //指定终端地址池为否,还必须满足新增APN方式为我要定制、细分业务类型为互联网GRE、专线GRE时,才展示,其他情况不展示
                KiteAttr apnModeAttr = inst.getAttr("200003996");
                if (Objects.nonNull(apnModeAttr) && !"100006952".equals(apnModeAttr.getValue())) {
                    Optional.ofNullable(inst.getAttr("200004010")).ifPresent(funcAttr -> {
                        funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                    });
                }
            }
            Optional.ofNullable(inst.getAttr("200004001")).ifPresent(kiteAttr -> {
                if (KiteStringUtils.isEqual("100006962", kiteAttr.getValue())) {
                    Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                        funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                    });
                }
            });
        }

        /* DNS服务器(备)联动处理
        VPDN-互联网GRE 客户自建DNS=Y且主备接入=Y时，选填
        VPDN-互联网L2TP、VPDN-专线GRE 客户自建DNS=Y时，选填
        VPDN-专线L2TP 无此属性 */
        // 200004013 客户自建DNS
        if (KiteStringUtils.isEqual("200004013", attr.getFieldName())) {
            //客户自建DNS"是"时
            if (KiteStringUtils.isEqual("1_0000106", attr.getValue())) {
                // 200004001 判断细分业务类型 100006960(互联网GRE) 100006961(互联网L2TP) 100006962(专线GRE) 100006963(专线L2TP)
                Optional.ofNullable(inst.getAttr("200004001")).ifPresent(busiKiteAttr -> {
                    if (KiteStringUtils.equals(busiKiteAttr.getValue(), "100006960")) {
                        // 200004006 主备接入
                        Optional.ofNullable(inst.getAttr("200004006")).ifPresent(accessKiteAttr -> {
                            // 200004016 DNS服务器(备)
                            Optional.ofNullable(inst.getAttr("200004016")).ifPresent(funcAttr -> {
                                // 200004016 主备接入 是-DNS服务器(备)展示  否-DNS服务器(备)隐藏
                                if (KiteStringUtils.isEqual("1_0000106", accessKiteAttr.getValue())) {
                                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                                    funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                                }
                                else if (KiteStringUtils.isEqual("1_0000107", accessKiteAttr.getValue())) {
                                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                                    funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                                }
                            });
                        });
                    }
                    else if (KiteStringUtils.equalsAny(busiKiteAttr.getValue(), "100006961", "100006962")) {
                        // 细分业务类型为100006961(互联网L2TP)、100006962(专线GRE)
                        Optional.ofNullable(inst.getAttr("200004016")).ifPresent(funcAttr -> {
                            // 200004016 主备接入 是-DNS服务器(备)展示  否-DNS服务器(备)隐藏
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                            funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                        });
                    }
                    else if (KiteStringUtils.equals(busiKiteAttr.getValue(), "100006963")) {
                        // 细分业务类型为100006963(专线L2TP) 200004016 DNS服务器(备) 隐藏
                        Optional.ofNullable(inst.getAttr("200004016")).ifPresent(funcAttr -> {
                            funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                            funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                        });

                    }
                });

            }
            else if (KiteStringUtils.isEqual("1_0000107", attr.getValue())) {
                //客户自建DNS"否"时 DNS服务器(备)隐藏
                Optional.ofNullable(inst.getAttr("200004016")).ifPresent(funcAttr -> {
                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                    funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                });
            }
        }
        
        Optional.ofNullable(inst.getAttr("200004001")).ifPresent(busiKiteAttr -> {
            if (KiteStringUtils.equals(busiKiteAttr.getValue(), "100006960")) {
              //主备接入联动
                if (KiteStringUtils.isEqual("200004006", attr.getFieldName())) {
                    Optional.ofNullable(inst.getAttr("200004009")).ifPresent(kiteAttr -> {
                        Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                            if (KiteStringUtils.isEqual("1_0000106", kiteAttr.getValue())) {
                                if (KiteStringUtils.isEqual("1_0000106", attr.getValue())) {
                                    funcAttr.setIsNull(KeyConsts.IFTRUE_F);
                                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                                }
                                else {
                                    funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                                }
                            }
                            else {
                                funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                                funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                            }

                        });
                    });
                }
                
              //指定终端地址池联动
                if (KiteStringUtils.isEqual("200004009", attr.getFieldName())) {
                    Optional.ofNullable(inst.getAttr("200004006")).ifPresent(kiteAttr -> {
                        Optional.ofNullable(inst.getAttr("200004012")).ifPresent(funcAttr -> {
                            if (KiteStringUtils.isEqual("1_0000106", attr.getValue())) {
                                if (KiteStringUtils.isEqual("1_0000106", kiteAttr.getValue())) {
                                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                                    funcAttr.setIsNull(KeyConsts.IFTRUE_F);
                                }
                                else {
                                    funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                                    funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                                }
                            }
                            else {
                                funcAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                                funcAttr.setIsNull(KeyConsts.IFTRUE_T);
                            }
                        });
                    });
                }
            }
        });
    }
}
